#ifndef _EBN_NET_PARAM_MANAGER_H_
#define _EBN_NET_PARAM_MANAGER_H_

#define DEFAULT_EXHIBITION_OF_MODULE    1.5
#define DEFAULT_INHIBITION_OF_MODULE    1.0
#define DEFAULT_EXHIBITION_OF_STATE     0.4
#define DEFAULT_INERTIA_OF_ACTIVATION   0.5
#define DEFAULT_ACTIVATION_THRESHOLD    2.0
#define DEFAULT_THRESHOLD_DECAY         0.1 // 10%
#define DEFAULT_EXECUTABILITY_THRESHOLD 0.8
#define DEFAULT_SIGMA                   0.5
#define DEFAULT_GAIN                    5


class CEbnNetParamManager
{
public:
    CEbnNetParamManager();
    ~CEbnNetParamManager();

    void setExhibitionOfModule(float exhibitionParam);
    void setInhibitionOfModule(float inhibitionParam);
    void setExhibitionOfState(float exhibitionParam);
    void setInertiaOfActivation(float inertia);
    void setActivationThreshold(float threshold);
    void setExecutabilityThreshold(float threshold);
    void setThresholdDecay(float decay);
    void setUpperBoundOfActivationThreshold(float upper);

    float getExhibitionOfModule(void);
    float getInhibitionOfModule(void);
    float getExhibitionOfState(void);
    float getInertiaOfActivation(void);

    float getActivationThreshold(void);
    float getExecutabilityThreshold(void);
    float getThresholdDecay(void);
    float getUpperBoundOfActivationThreshold(void);

    void setSigmoidParams(float k, float sigma);
    float sigmoidTransferFunction(float value);

    void updateThresholdDecaying(void);
    void resetThresholdDecaying(void);

protected:
    bool parametersValidation(void);

private:

    float mExhibitionOfModule;
    float mInhibitionOfModule;
    float mExhibitionOfState;

    float mInertiaOfActivation;
    float mActivationThreshold;
    float mExecutabilityThreshold;
    float mThresholdDecay;
    float mUpperBoundOfActivationThreshold;

    float mSigmoidParamK;
    float mSigmoidParamSigma;
};

#endif // _EBN_NET_PARAM_MANAGER_H_
